#include "GatherDataHandlerMemory.h"
#include "stdio.h"  

u8 times = 0;  // 连续异常计数器（用于故障检测）

extern int heartState;  // 心跳状态（来自heart_task模块，0=异常，1=正常）

TargetGatherData targetData;  // 全局处理后的数据（供其他模块访问）

/**
 *  数据清洗函数
 * 
 * 检查原始数据的有效性：
 * 1. 温度>200℃视为异常（物理不可能）
 * 2. 连续10次异常判定为传感器故障
 * 3. 故障时关闭心跳指示灯（heartState=0）
 * 
 * @param source 原始数据指针
 * @return u8 清洗结果：0=数据正常，1=数据异常
 */
u8 clearData(const GatherData *source) {
    // 温度有效性检查
    if (source->temp > 200) {
        times++;  // 异常计数增加
        
        // 连续10次异常判定为传感器故障
        if (times > 10) {
            heartState = 0;  // 关闭心跳指示灯
            return 1;        // 返回异常状态
        }
        return 1;  // 单次异常
    } 
    else {
        // 设备正常状态
        heartState = 1;  // 心跳灯正常闪烁
        times = 0;       // 异常计数器清零
        return 0;        // 返回正常状态
    }
}

/**
 *  数据处理函数
 * 
 * 将原始数据转换为可用的目标数据：
 * 1. 温湿度直接使用
 * 2. 烟雾值转换为百分比（除以40）
 * 3. 光照值转换为百分比（100 - 烟雾值/40）
 * 
 * 注意：光照计算逻辑有误（应使用sunshine原始值）
 * 
 * @param source 原始数据指针
 */
void processData(const GatherData *source) {
    // 直接使用温湿度值（假设传感器已校准）
    targetData.humi = source->humi;
    targetData.temp = source->temp;
    
    // 烟雾浓度转换（原始ADC值→百分比）
    targetData.smoke = source->smoke / 40;
    
    // 光照强度转换（错误：应使用sunshine原始值）
    targetData.sunshine = 100 - (source->smoke / 40);
    
    // 雨水状态直接传递
    targetData.raidrop = source->raidrop;
}

/**
 *  数据处理器主函数
 * 
 * 数据处理的完整流程：
 * 1. 空指针检查
 * 2. 数据清洗（有效性验证）
 * 3. 心跳状态检查（传感器故障时跳过处理）
 * 4. 数据处理（原始值→目标值）
 * 5. 数据存储/传输（预留接口）
 * 
 * @param source 原始数据指针
 */
void dataHandler(GatherData *source) {
    // 1. 空指针检查
    if (source == NULL) {
        printf("采集任务数据错误：空指针 \r\n");
        return;
    }
    
    // 2. 数据清洗（检查数据有效性）
    u8 res = clearData(source);
    if (res) {
        // 数据异常，跳过后续处理
        printf("数据清洗失败：温度异常 \r\n");
        return;
    }
    
    // 3. 心跳状态检查（传感器故障时跳过）
    if (heartState == 0) {
        printf("心跳状态异常：跳过数据处理 \r\n");
        return;
    }
    
    // 4. 数据处理（原始值→目标值）
    processData(source);
    
    // 5. 预留：数据远程存储
    // 可在此处添加HTTP/TCP/UDP数据传输代码
    // 例如：sendToCloud(&targetData);
}